<?php
include_once MODELS."rota.php";
include_once MODELS."cidade.php";

class LocalidadeModel extends Database {
    const TABLE = "localidade";
    
    const ID = "id";
    const NOME = "nome_localidade";
    const CIDADE = "id_cidade";
    const ROTA = "id_rota";
    const SEQ_ROTA = "seq_rota";
    
    public function insert(Localidade $localidade) {
        $fields = implode(",", array(self::NOME, self::CIDADE, self::ROTA, self::SEQ_ROTA));
        $localidade = get_object_vars($localidade);
        unset($localidade["id"]);
        unset($localidade["loja"]);
        $res = parent::insert(self::TABLE, $fields, Database::turnInValues($localidade));
        return $res;
    }
    
    public function select($fields = "*", $condition = null, $limit = null) {
        
        if(is_array($fields)) $fields = implode(",", $fields);
        
        $tables = array(self::TABLE);
        if(strpos($fields, RegiaoModel::LOJA)){

            $this_condition = self::ROTA." = ".RotaModel::TABLE.".".RotaModel::ID;
            $this_condition .= " AND ".RotaModel::REGIAO." = ".RegiaoModel::TABLE.".".RegiaoModel::ID;
        
            if(is_null($condition)) $condition = $this_condition;
            else $condition .= " AND $this_condition";
        
            $tables[] = RotaModel::TABLE; 
            $tables[] = RegiaoModel::TABLE;
            
        }
        
        $res = parent::select(implode(",",$tables), $fields, $condition, $limit);
        $ana = $this->getAnnalisses();
        $localidades = array();
        
        while(($row = $ana->fetchObject($res)) !== false){
            $localidade = new Localidade( isset($row->{ self::ID })? $row->{ self::ID } : 0,
                                             isset($row->{ self::NOME })? ($row->{ self::NOME }) : "",
                                             isset($row->{ self::CIDADE })? $row->{ self::CIDADE } : 0,
                                             isset($row->{ self::ROTA })? $row->{ self::ROTA } : 0,
                                             isset($row->{ self::SEQ_ROTA })? $row->{ self::SEQ_ROTA } : 0 );
                                           
            if(isset($row->{RegiaoModel::LOJA})){
                $localidade->loja = $row->{RegiaoModel::LOJA};
            }
            $localidades[] = $localidade;
        }
        return $localidades;
    }
    
    public function superSelect($condition = null, $limit = null){
        
        $fields = array( self::TABLE.".".self::ID, self::NOME, 
                         CidadeModel::NOME, RotaModel::NOME, self::SEQ_ROTA,
                         RegiaoModel::LOJA );
        
        $fields_joined = implode(",", $fields);
        
        $this_condition = self::TABLE.".".self::CIDADE." = ". CidadeModel::TABLE.".".  CidadeModel::ID;
        $this_condition .= " AND ".self::TABLE.".".self::ROTA." = ".RotaModel::TABLE.".".RotaModel::ID;
        $this_condition .= " AND ".RotaModel::REGIAO." = ".RegiaoModel::TABLE.".".RegiaoModel::ID;
        
        if(is_null($condition)) $condition = $this_condition;
        else $condition .= " AND ".$this_condition;
        
        $tables = implode(",", array(self::TABLE, CidadeModel::TABLE, 
                                     RotaModel::TABLE, RegiaoModel::TABLE));
        
        $res = parent::select($tables, $fields_joined, $condition, $limit);
        $ana = $this->getAnnalisses();
        
        $localidades = array();
        while(($row = $ana->fetchObject($res)) !== false){
            $localidade = new Localidade( $row->{ self::ID },
                                          $row->{ self::NOME },
                                          $row->{ CidadeModel::NOME },
                                          $row->{ RotaModel::NOME },
                                          $row->{ self::SEQ_ROTA } );
            
            $localidade->loja = $row->{RegiaoModel::LOJA};
            $localidades[] = $localidade;
                                           
        }
        return $localidades;
    }
    
    public function delete($condition) {
        return parent::delete(self::TABLE, $condition);
    }
    
    public function update(Localidade $localidade) {
        $values = array(self::CIDADE => (int) $localidade->cidade, 
                        self::NOME => $localidade->nome,
                        self::SEQ_ROTA => $localidade->ordem,
                        self::ROTA => $localidade->rota );
        $values = Database::turnInUpdateValues($values);
        return parent::formattedUpdates(self::TABLE, $values, self::ID." = ".$localidade->id);
    }

    public function updateRotaOfLocalidades($localidades, $rota){
        $condition = self::ID." IN ($localidades)";
        return parent::update(self::TABLE, self::ROTA, $rota, $condition);
    }

    public function simpleUpdate($field, $value, $condition) {
        return parent::update(self::TABLE, $field, $value, $condition);
    }
    
    public function handleError() {
        $err_code = $this->errorCode(); 
        if($err_code == Annalisses::ERR_DUPLICATE) 
            return "Já existe uma localidade com este nome";
        return parent::handleError();
    }
}

?>
